<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="uocN9" id="uocN9"><span data-lake-id="u324817e4" id="u324817e4">典型回答</span></h1>
  <p data-lake-id="u9755a78d" id="u9755a78d"><br></p>
  <p data-lake-id="u29f380ce" id="u29f380ce"><span data-lake-id="u393a4510" id="u393a4510">我们都知道，Java中有两种编译方法：</span></p>
  <p data-lake-id="u91c6f18e" id="u91c6f18e"><span data-lake-id="ub06411c6" id="ub06411c6">1、javac把java代码编译成字节码，然后由Java虚拟机解释执行。</span></p>
  <p data-lake-id="u0ad63848" id="u0ad63848"><span data-lake-id="uc48eac88" id="uc48eac88">2、JIT把java代码直接编译成机器码，然后由Java虚拟机直接运行。</span></p>
  <p data-lake-id="u968087d8" id="u968087d8"><span data-lake-id="u52eb8fd8" id="u52eb8fd8">​</span><br></p>
  <p data-lake-id="u7deaa385" id="u7deaa385"><br></p>
  <p data-lake-id="u80ec488a" id="u80ec488a"><span data-lake-id="u2ddca4d1" id="u2ddca4d1">但是，JIT编译有一些比较明显的缺点也是不能忽视的：</span></p>
  <p data-lake-id="u5abfc3ec" id="u5abfc3ec"><span data-lake-id="ub4cc0e3b" id="ub4cc0e3b">​</span><br></p>
  <ol list="ua1c9372c">
   <li fid="ud04da61e" data-lake-id="uc3f00fb2" id="uc3f00fb2" data-lake-index-type="true"><strong><span data-lake-id="ucdb17bed" id="ucdb17bed">增加启动时间</span></strong><span data-lake-id="u521fb632" id="u521fb632">：由于JIT编译器在程序运行时编译代码，它可能导致应用程序的启动时间较长。</span></li>
   <li fid="ud04da61e" data-lake-id="uc6408372" id="uc6408372" data-lake-index-type="true"><strong><span data-lake-id="uc7d7498f" id="uc7d7498f">可能会影响应用性能</span></strong><span data-lake-id="ufedef673" id="ufedef673">：JIT</span><span data-lake-id="u0066770e" id="u0066770e" style="color: rgb(25, 27, 31)">编译是需要进行热点代码检测、代码编译等动作的，这些都是要占用运行期的资源，所以，JIT编译过程中也可能会影响应用性能。</span></li>
  </ol>
  <p data-lake-id="u372a19b7" id="u372a19b7"><br></p>
  <p data-lake-id="ua72706ed" id="ua72706ed"><span data-lake-id="ud245ee82" id="ud245ee82">而在如今的云原生盛行的今天，应用的快速启动以及减少预热时长是非常重要的，其实是Serverless场景中，所以，</span><span data-lake-id="u9c03bc5a" id="u9c03bc5a" class="lake-fontsize-12" style="color: rgb(37, 41, 51)">一</span><span data-lake-id="u2a8b2025" id="u2a8b2025">个新兴的编译器GraalVM就诞生了。他提出了一种新的编译方式——</span><span data-lake-id="u4b87370b" id="u4b87370b" class="lake-fontsize-12" style="color: rgb(37, 41, 51)">Ahead of Time，及AOT编译。</span></p>
  <p data-lake-id="u27f0e2db" id="u27f0e2db"><span data-lake-id="u6dc375f3" id="u6dc375f3">​</span><br></p>
  <p data-lake-id="u8a7a5f07" id="u8a7a5f07"><strong><span data-lake-id="u7807f475" id="u7807f475">AOT编译</span></strong><span data-lake-id="ue2782cf6" id="ue2782cf6">，翻译一下就是提前编译，它不像JIT一样在运行期才生成机器码，而是在编译期间就将字节码转换为机器码，这就直接省去了运行时对JVM的依赖。</span></p>
  <p data-lake-id="u48a54893" id="u48a54893"><span data-lake-id="u60421e91" id="u60421e91">​</span><br></p>
  <p data-lake-id="u71442b07" id="u71442b07"><span data-lake-id="u0e3451f0" id="u0e3451f0">这里多说一句，很多人会误以为编译期的编译不是javac吗？其实javac只是把源代码(.java)编译成中间代码(.class），这种中间代码我们叫做字节码，而字节码并不是机器代码，无法直接执行，需要解释器进行解释执行。详见：</span></p>
  <p data-lake-id="u8441bd0a" id="u8441bd0a"><span data-lake-id="u57f11ba0" id="u57f11ba0"><br><br></span></p>
  <p data-lake-id="u21ea50f5" id="u21ea50f5"><span data-lake-id="u43f9c63a" id="u43f9c63a">因为AOT编译是在编译期就生成机器代码了，所以，应用启动时就不需要编译，那么他就可以大大的减少应用的启动时间，提升系统的整体性能。所以他非常适用于对启动时间敏感的场景，例如云原生应用。</span></p>
  <p data-lake-id="u695a2399" id="u695a2399"><span data-lake-id="u1d85a543" id="u1d85a543">​</span><br></p>
  <p data-lake-id="ue3559ee9" id="ue3559ee9"><img src="https://cdn.nlark.com/yuque/0/2024/png/5378072/1705410553249-a34b25c4-32a6-46bc-81e9-8a2a9ea82aa2.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_22%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="u09e903d2" id="u09e903d2"><span data-lake-id="u40f8d33e" id="u40f8d33e">​</span><br></p>
 </body>
</html>